package com.example.exe;

import android.app.Activity;
import android.app.Dialog;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.util.Log;
import android.view.View;
import android.widget.AbsListView;

import com.example.TestPlugin.MyActivity;

import java.io.File;
import java.net.URI;
import java.net.URL;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

import app.auto.designer.TestActivity;
import app.auto.designer.view.Parser;
import app.auto.runner.base.intf.ListBuilder;
import app.auto.runner.base.intf.MapBuilder;
import app.auto.runner.base.intf.json.JsonToMapUtils;
import app.auto.runner.base.utility.ShareAlert;
import app.auto.runner.base.utility.ToastUtil;

public class MainActivity extends TestActivity {


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (true) return;

//        String reaadass = ReadFileUtil.readAss("sample.json", this);
//        Toast.makeText(this, Json2XML.json2xml(reaadass,null),Toast.LENGTH_LONG).show();
//        try {
//            JsonView jsonview = JSONViewHelper2.parse(reaadass, this);
//            setContentView(jsonview);
//        } catch (JSONException e) {
//            e.printStackTrace();
//        }
//        if (true) return;
        try {
            String stringreader = new String("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
                    "    <Button\n" +
                    "        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n" +
                    "        android:id=\"@+id/attr_constant\"\n" +
                    "        android:layout_width=\"wrap_content\"\n" +
                    "        android:layout_height=\"wrap_content\"\n" +
                    "        android:layout_alignParentRight=\"true\"\n" +
                    "        android:layout_centerVertical=\"true\"\n" +
                    "        android:layout_marginRight=\"10dip\"\n" +
                    "        android:background=\"#ffffff\"\n" +
                    "        android:ellipsize=\"end\"\n" +
                    "        android:gravity=\"center\"\n" +
                    "        android:lines=\"1\"\n" +
                    "        android:maxWidth=\"90dip\"\n" +
                    "        android:padding=\"7dip\"\n" +
                    "        android:text=\"选\"\n" +
                    "        android:textColor=\"@color/text_black\"\n" +
                    "        android:textSize=\"15dip\"\n" +
                    "\n" +
                    "        />");

            setContentView(Parser.withActivity(MainActivity.this).parse(stringreader, null, null).getView());
//        Object v = invoke(Parent.class,"field",new Child());
//        try {
//            getClasses();
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
        } catch (Exception e) {
            e.printStackTrace();
        }
//        if (true) {
//            return;
//        }

//        {
//            "android/view/View": {
//            "android:duplicateParentState": {
//                "type": "boolean|reference"
//            },
//            "android:minWidth": {
//                "type": "reference|dimension"
//            },
//            "android:drawingCacheQuality": {
//                "type": "constant",
//                        "constant": {
//                    "0": "auto",
//                            "1": "low",
//                            "2": "high"
//                }
//            },
//            "android:fitsSystemWindows": {
//                "type": "boolean|reference"
//            },
//            "android:importantForAccessibility": {
//                "type": "reference|integer|constant",
//                        "constant": {
//                    "4": "noHideDescendants",
//                            "0": "auto",
//                            "1": "yes",
//                            "2": "no"
//                }
//            },
//            "android:layoutDirection": {
//                "type": "constant",
//                        "constant": {
//                    "0": "ltr",
//                            "1": "rtl",
//                            "2": "inherit",
//                            "3": "locale"
//                }
//            },
//            "android:clickable": {
//                "type": "boolean|reference"
//            },
//            "android:accessibilityLiveRegion": {
//                "type": "reference|integer|constant",
//                        "constant": {
//                    "0": "none",
//                            "1": "polite",
//                            "2": "assertive"
//                }
//            },
//            "android:longClickable": {
//                "type": "boolean|reference"
//            },
//            "android:isScrollContainer": {
//                "type": "boolean|reference"
//            },
//            "android:fadingEdgeLength": {
//                "type": "reference|dimension"
//            },
//            "android:focusableInTouchMode": {
//                "type": "boolean|reference"
//            },
//            "android:alpha": {
//                "type": "reference"
//            }
//        },
//            "android/view/ViewGroup": {
//            "android:persistentDrawingCache": {
//                "type": "constant",
//                        "constant": {
//                    "0x2": "scrolling",
//                            "0x3": "all",
//                            "0x1": "animation",
//                            "0x0": "none"
//                }
//            },
//            "android:clipToPadding": {
//                "type": "boolean|reference"
//            },
//            "android:addStatesFromChildren": {
//                "type": "boolean|reference"
//            },
//            "android:layoutAnimation": {
//                "type": "reference"
//            },
//            "android:layout_height": {
//                "type": "reference|dimension|constant",
//                        "constant": {
//                    "-1": "fill_parent"
//                }
//            },
//            "android:animationCache": {
//                "type": "boolean|reference"
//            }
//        },
//            "android/view/ViewGroup.MarginLayoutParams": {
//            "android:layout_marginStart": {
//                "type": "reference|dimension"
//            },
//            "android:layout_marginBottom": {
//                "type": "reference|dimension"
//            },
//            "android:layout_marginLeft": {
//                "type": "reference|dimension"
//            }
//        },
//            "android/widget/ImageView": {
//            "android:baselineAlignBottom": {
//                "type": "boolean|reference"
//            },
//            "android:adjustViewBounds": {
//                "type": "boolean|reference"
//            }
//        },
//            "android/widget/LinearLayout": {
//            "android:divider": {
//                "type": "color|reference"
//            },
//            "android:layout_gravity": {
//                "type": "constant",
//                        "constant": {
//                    "0x00800003": "start",
//                            "0x01": "center_horizontal",
//                            "0x80": "clip_vertical",
//                            "0x00800005": "end",
//                            "0x05": "right",
//                            "0x70": "fill_vertical",
//                            "0x50": "bottom",
//                            "0x77": "fill",
//                            "0x10": "center_vertical",
//                            "0x03": "left",
//                            "0x30": "top",
//                            "0x08": "clip_horizontal",
//                            "0x07": "fill_horizontal",
//                            "0x11": "center"
//                }
//            },
//            "android:measureWithLargestChild": {
//                "type": "boolean|reference"
//            },
//            "android:baselineAligned": {
//                "type": "boolean|reference"
//            }
//        },
//            "android/widget/RelativeLayout": {
//            "android:layout_above": {
//                "type": "reference"
//            },
//            "android:gravity": {
//                "type": "constant",
//                        "constant": {
//                    "0x00800003": "start",
//                            "0x01": "center_horizontal",
//                            "0x80": "clip_vertical",
//                            "0x00800005": "end",
//                            "0x05": "right",
//                            "0x70": "fill_vertical",
//                            "0x50": "bottom",
//                            "0x77": "fill",
//                            "0x10": "center_vertical",
//                            "0x03": "left",
//                            "0x30": "top",
//                            "0x08": "clip_horizontal",
//                            "0x07": "fill_horizontal",
//                            "0x11": "center"
//                }
//            }
//        },
//            "android/widget/TextView": {
//            "android:minLines": {
//                "type": "reference|integer"
//            },
//            "android:capitalize": {
//                "type": "constant",
//                        "constant": {
//                    "0": "none",
//                            "1": "sentences",
//                            "2": "words",
//                            "3": "characters"
//                }
//            },
//            "android:linksClickable": {
//                "type": "boolean|reference"
//            },
//            "android:drawableRight": {
//                "type": "color|reference"
//            },
//            "android:textAppearance": {
//                "type": "reference"
//            },
//            "android:textColorLink": {
//                "type": "color|reference"
//            },
//            "android:privateImeOptions": {
//                "type": "reference|string"
//            },
//            "android:textColorHighlight": {
//                "type": "color|reference"
//            },
//            "android:includeFontPadding": {
//                "type": "boolean|reference"
//            },
//            "android:lineSpacingExtra": {
//                "type": "reference|dimension"
//            },
//            "android:autoText": {
//                "type": "boolean|reference"
//            },
//            "android:maxEms": {
//                "type": "reference|integer"
//            },
//            "android:height": {
//                "type": "reference|dimension"
//            },
//            "android:drawableBottom": {
//                "type": "color|reference"
//            },
//            "android:typeface": {
//
//            },
//            "android:maxWidth": {
//                "type": "reference|dimension"
//            },
//            "android:cursorVisible": {
//                "type": "boolean|reference"
//            },
//            "android:autoLink": {
//                "type": "constant",
//                        "constant": {
//                    "0x0f": "all",
//                            "0x00": "none",
//                            "0x08": "map",
//                            "0x01": "web",
//                            "0x02": "email",
//                            "0x04": "phone"
//                }
//            },
//            "android:textStyle": {
//
//            },
//            "android:text": {
//                "type": "reference|string"
//            },
//            "android:inputType": {
//                "type": "constant",
//                        "constant": {
//                    "0x00000001": "text",
//                            "0x00000000": "none"
//                }
//            },
//            "android:imeActionLabel": {
//                "type": "reference|string"
//            },
//            "android:ellipsize": {
//
//            },
//            "android:drawableTop": {
//                "type": "color|reference"
//            },
//            "android:drawableLeft": {
//                "type": "color|reference"
//            },
//            "android:maxLength": {
//                "type": "reference|integer"
//            },
//            "android:shadowColor": {
//                "type": "color|reference"
//            },
//            "android:freezesText": {
//                "type": "boolean|reference"
//            },
//            "android:textScaleX": {
//                "type": "reference"
//            },
//            "android:password": {
//                "type": "boolean|reference"
//            },
//            "android:numeric": {
//                "type": "constant",
//                        "constant": {
//                    "0x03": "signed",
//                            "0x05": "decimal",
//                            "0x01": "integer"
//                }
//            },
//            "android:ems": {
//                "type": "reference|integer"
//            },
//            "android:shadowRadius": {
//                "type": "reference"
//            }
//        }
//        }
        new Thread() {
            @Override
            public void run() {
                super.run();
//                JsonToMapUtils.mapToJson();
                try {
                    String name = "TextView";
                    List<String> lt = ListBuilder.build()
//                        .add("android/widget/LinearLayout.LayoutParams")
//                        .add("android/widget/RelativeLayout.LayoutParams")
//                        .add("android/widget/RelativeLayout")
//                        .add("android/widget/LinearLayout")
//                        .add("android/view/ViewGroup.MarginLayoutParams")
//                        .add("android/view/ViewGroup")
//                        .add("android/widget/EditText")
//                        .add("android/view/ViewGroup.LayoutParams")
//                        .add("android/view/View")
//                        .add("AbsListView")
//                        .add("AdapterView")
//                            .add("ScrollView")
                            .add("LinearLayout.LayoutParams")
//                        .add("TextView")
//                        .add("ImageView")
//                        .add("Button")
//                        .add("RadioButton")
// .add("CheckBox")
                            .get();
                    MapBuilder all = MapBuilder.build();
                    for (String s : lt) {
                        String n = s;
                        if (!s.contains("android")) {
                            n = "android/widget/" + s;
                        }
                        MapBuilder abuilder = null;
                        try {
                            abuilder = getProperties(n);
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                        if (abuilder != null && abuilder.get().size() > 0) {
                            all.add(n, abuilder.get());
                        }
                    }
                    Map<String, MapBuilder> m = all.get();
                    Map finalm = new TreeMap();

                    for (Map.Entry<String, MapBuilder> kv : m.<String, MapBuilder>entrySet()) {

                        String ky = kv.getKey().toString().replace(".LayoutParams", "");
                        if (!finalm.containsKey(ky)) {
                            finalm.put(ky, kv.getValue());
                        } else {
                            ((Map) finalm.get(ky)).putAll((Map) kv.getValue());
                        }
                    }
                    Map rt = new TreeMap();
                    for (Object k : finalm.keySet()) {
                        rt.put(k, JsonToMapUtils.mapToJson((Map) finalm.get(k)));

                    }
                    String json = JsonToMapUtils.mapToJson(rt);
                    ShareAlert.shareAlert(MainActivity.this,json);
                } catch (Exception e) {
                    ToastUtil.live(MainActivity.this).toast(e.getCause() + " " + e.getMessage());
                }
//                ShareAlert.shareAlert(GestureActivity.this, );

            }
        }.start();

    }

    //
    Dialog dialog;

    public void getClasses() throws Exception {
        Class clazz = View.class;
        ClassLoader loader = clazz.getClassLoader();
        // 1. 通过classloader载入包路径，得到url
        URL url = loader.getResource("android.widget.");
        URI uri = url.toURI();
        // 2. 通过File获得uri下的所有文件
        File file = new File(uri);
        File[] files = file.listFiles();
        for (File f : files) {
            String fName = f.getName();
            if (!fName.endsWith(".class")) {
                continue;
            }
            fName = fName.substring(0, fName.length() - 6);
            String perfix = "android.widget.";
            String allName = perfix + fName;
            // 3. 通过反射加载类
            clazz = Class.forName(allName);
            System.out.println("class ---- " + clazz);
        }
    }

    //<h2>XML Attributes</h2>  <A NAME="attr_
    private MapBuilder getProperties(String name) throws Exception {

        String text = Http.myGetHttpFile2("http://www.android-doc.com/reference/" + name + ".html");
        int i = Prt.newInstance("<h2>XML Attributes</h2>").getAfterIndex(text);
        text = text.substring(i);
        final MapBuilder all = MapBuilder.build();
        boolean first = true;
        while (true) {
            Prt a = Prt.cat("<A NAME=\"attr_", "\"></A>", text);

            if (a == null) {
                int j = 0;
                j++;
                break;
            }
            first = false;
            if (a.getPrt().contains("visibility")) {
                int j = 1;
                j++;
            }

            text = text.substring(a.getBoundafteridx());
            Prt cnt = Prt.cat("></A>", "<A NAME=\"attr_", text);
            Log.i("", " <A NAME=attr_ " + cnt + " ></A>");


            Prt p = Prt.cat("<tr><th>Constant</th>", "</table>", cnt == null ? text : cnt.getPrt());

            if (p == null) {
                if (cnt == null) {

                    continue;
                }

//                text = text.substring(cnt.getBoundafteridx());

            }

            text = postpart(text, all, a, cnt, p);
            if (text == null) {
                int j = 0;
                j++;
                break;
            }

        }
        return all;
    }

    @Nullable
    private String postpart(String text, MapBuilder all, Prt a, Prt cnt, Prt p) {
        MapBuilder cntbuilder = MapBuilder.build();
//            cntbuilder.add("attr", a.getPrt());
        String type = "";
        MapBuilder typebuilder = MapBuilder.build().add("be a reference", "reference").add("be a color", "color").add("be an integer", "integer").add("be a dimension", "dimension").add("be a boolean", "boolean").add("be a string", "string");
        Map typeM = typebuilder.get();
        String types = "";

        String cntpart = cnt == null ? text : cnt.getPrt();
        for (Object key : typeM.keySet()) {
            if (cntpart.contains(key.toString())) {
                types += "|" + typeM.get(key.toString()).toString();
            }
        }
        MapBuilder.newInstance();
//
        int index = 0;
        int balance;
        if (p != null) {
            String next = p.getPrt();

            boolean hasconstant = false;
            while (true) {
                hasconstant = true;
                next = next.substring(index);
                Prt cnst = Prt.cat("<tr><td><code>", "</code>", next);
                if (cnst == null || cnst.getBoundpreidx() == -1) {

                    break;
                }

                Prt value = Prt.cat("</code></td><td>", "</td><td> ", next);
                if (value == null) {

                    break;
                }
                MapBuilder.hold().add(value.getPrt(), cnst.getPrt());

                index = value.getBoundafteridx() + new Prt("</td><td> ").getLeng();

            }
        }
        String o = JsonToMapUtils.mapToJson(MapBuilder.hold().get());

        if (o != null && !o.equals("{}")) {
            types += "|constant";
            types = types.substring(1);
            cntbuilder.add("constant", o);
            cntbuilder.add("type", types);
        } else {
            if (!types.equals("")) {
                types = types.substring(1);
                cntbuilder.add("type", types);
            }
        }

        all.add(a.getPrt(), JsonToMapUtils.mapToJson(cntbuilder.get()));
        if (cnt == null) {
            return text;
        }
        text = text.substring(cnt.getBoundafteridx());
        return text;
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
    }

    public static class Prt {
        private final String Prt;

        public Prt(String Prt) {
            this.Prt = Prt;
        }

        private static Prt hold;

        public static Prt newInstance(String Prt) {
            return hold = new Prt(Prt);
        }

        public static Prt hold() {
            return hold;
        }

        public int getLeng() {
            return Prt.length();
        }

        public int getAfterIndex(String whole) {
            return whole.indexOf(Prt) + getLeng();
        }

        public int getPreviousIndex(String whole) {
            return whole.indexOf(Prt);
        }

        public static Prt cat(String pre, String after, String whole) {
            String p;
            try {
                p = whole.substring(new Prt(pre).getAfterIndex(whole), new Prt(after).getPreviousIndex(whole));
            } catch (Exception e) {
                return null;
            }
            return new Prt(p).setBoundPre(pre, whole).setBoundAfter(after, whole);
        }

        public String getPrt() {
            return Prt;
        }

        public int preidx;
        public int afteridx;

        public Prt setBoundPre(String prestr, String txt) {
            Prt prt = new Prt(prestr);

            boundpreidx = prt.getAfterIndex(txt);
            return this;
        }

        public int boundpreidx;
        public int boundafteridx;


        public Prt setBoundAfter(String prestr, String txt) {
            Prt prt = new Prt(prestr);

            boundafteridx = prt.getPreviousIndex(txt);
            return this;
        }

        public int getBoundpreidx() {
            return boundpreidx;
        }

        public int getBoundafteridx() {
            return boundafteridx;
        }

        public int getPreidx() {
            return preidx;
        }

        public int getAfteridx() {
            return afteridx;
        }
    }
}
